(function(root) {
  function jQuery() {
    return new jQuery.prototype.init();
  }
  jQuery.fn = jQuery.prototype = {
    init: function() {},
    css: function() {}
  };
  jQuery.fn.extend = jQuery.extend = function() {
    // 获取第一个参数
    var target = arguments[0] || {};
    // 参数长度
    var length = arguments.length;
    // 默认第一个参数
    var i = 1;
    // 是否为深拷贝
    var deep = false;
    var options, name, copy, src,copyIsArray,clone;
    // 检测第一个参数是否为bool值
    if (typeof target === "boolean") {
      deep = target;
      target = arguments[1];
      i = 2;
    }
    // 如果参数不是对象，赋值
    if (typeof target !== "object") {
      target = {};
    }
    // 如果只传递一个参数，就扩展jq本身
    if (length === i) {
      target = this;
      i--;
    }
    // 深拷贝|浅拷贝
    for (; i < length; i++) {
      // options等于第i个参数，不为null就给target赋值，实现浅拷贝
      if ((options = arguments[i]) !== null) {
        for (name in options) {
          copy = options[name];
          src = target[name];
          // 如果copy为对象或数组
          if (deep && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy))) ) {
            // 克隆属性的值
            if(copyIsArray){
                copyIsArray=false;
                clone = jQuery.isArray(src) ? src :[]
            }else{
                clone = jQuery.isPlainObject(src) ? src :{}
            }
            // 递归进行属性赋值
            target[name] = jQuery.extend(deep,clone,copy);
          } else if (copy !== undefined) {
            // 浅拷贝
            target[name] = copy;
          }
        }
      }
    }
    return target;
  };
  // 共享原型对象
  jQuery.fn.init.prototype = jQuery.fn;
  // 扩展jquery的属性方法
  jQuery.extend({
    // 是否为对象
    isPlainObject: function(obj) {
      return toString.call(obj) === "[object Object]";
    },
    // 是否为数组
    isArray: function(obj) {
      return toString.call(obj) === "[object Array]";
    }
  });
  root.$ = root.jquery = jQuery;
})(this);
